package com.qhs.framework.utils;

import java.math.BigDecimal;
import java.util.regex.Pattern;

/**
 * 常用的字符串验证方法
 */
public abstract class StringUtil {
    private static final String INTEGER_REGULAR = "[0-9]*";
    private static final String NUMBER_CHARTER = "[a-zA-Z0-9]*";
    private static final String TEL_REGULAR = "^[1][3,5,7,8][0-9]{9}$";
    private static final String EMAIL_CHARTER = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
    private static final String IDCARD_CHARTER = "^[1-9]\\d{5}[1-9]\\d{3}((0[1-9])|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}[A-Z0-9a-z]$";

    /**
     * 验证是否是整数字符串
     *
     * @return true 表示合法，false 表示不合法
     */
    public static boolean isNumeric(String str) {
        Pattern pattern = Pattern.compile(INTEGER_REGULAR);
        return pattern.matcher(str).matches();
    }

    /**
     * 验证是否是规定长度的整数字符串
     *
     * @param str
     * @param maxLength 最大长度,没有最大长度限制就给null
     * @param minLength 最小长度,没有就给null
     * @return true 表示合法，false 表示不合法
     */
    public static boolean isNumeric(String str, Integer maxLength, Integer minLength) throws Exception {
        Pattern pattern = Pattern.compile(INTEGER_REGULAR);//[a-zA-Z0-9]*
        if (maxLength < minLength) {
            throw new Exception("参数maxLength：" + maxLength + "不能比minLength：" + minLength + "小");
        } else {
            if (hasText(str)) {
                if (maxLength != null && str.length() > maxLength) {
                    return false;
                } else if (minLength != null && str.length() < minLength) {
                    return false;
                } else {
                    return pattern.matcher(str).matches();
                }
            } else {
                return false;
            }
        }
    }

    /**
     * 验证是否是合法的字符和数值组成的文本串
     *
     * @param str       要验证的字符串
     * @param maxLength 最大长度,没有最大长度限制就给null
     * @param minLength 最小长度,没有就给null
     * @return true 表示合法，false 表示不合法
     */
    public static boolean checkCharter(String str, Integer maxLength, Integer minLength) throws Exception {
        Pattern pattern = Pattern.compile(NUMBER_CHARTER);//[a-zA-Z0-9]*
        if (maxLength < minLength) {
            throw new Exception("参数maxLength：" + maxLength + "不能比minLength：" + minLength + "小");
        } else {
            if (hasText(str)) {
                if (maxLength != null && str.length() > maxLength) {
                    return false;
                } else if (minLength != null && str.length() < minLength) {
                    return false;
                } else {
                    return pattern.matcher(str).matches();
                }
            } else {
                return false;
            }
        }
    }

    /**
     * 验证数字的合法性，只能是整数或者小数
     *
     * @param number
     * @return true 表示合法，false 表示不合法
     */
    public boolean checkDigit(String number) {
        try {
            BigDecimal bigDecimal = new BigDecimal(number);
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    /**
     * 验证文本内容的长度是否在允许的范围内
     *
     * @param str
     * @param maxLength 允许输入的最大字符数，没有限制就给null
     * @param minLength 允许输入的最小字符数，没有限制就给null
     * @param flag      中文代表几个字符来处理，一个字符穿一个*，两个字符传两个**
     * @return 空串 表示合法，非空 表示不合法
     */
    public static String checkStringLength(String str, Integer maxLength, Integer minLength, String flag){
        String msg = "";
        if (maxLength != null && minLength != null && maxLength < minLength) {
            msg = "参数maxLength：" + maxLength + "不能比minLength：" + minLength + "小";
        } else {
            if (hasText(str)) {
                str = str.replaceAll("\\s+", "");//替换空格
                str = str.replaceAll("[\u0391-\uFFE5]", flag);//替换中文，一个中文=2个字符
                if (maxLength != null && str.length() > maxLength) {
                    msg = "超出了允许输入的最大字符数(" + maxLength + ")，允许的字符区间为【" + minLength + "，" + maxLength + "】";
                } else if (minLength != null && str.length() < minLength) {
                    msg = "输入内容太少，允许的字符区间为【" + minLength + "，" + maxLength + "】";
                }
            }
        }
        return msg;
    }

    /**
     * Check if a String has text. More specifically, returns <code>true</code>
     * if the string not <code>null<code>, it's <code>length is > 0</code>, and
     * it has at least one non-whitespace character.
     * <p><pre>
     * StringUtils.hasText(null) = false
     * StringUtils.hasText("") = false
     * StringUtils.hasText(" ") = false
     * StringUtils.hasText("12345") = true
     * StringUtils.hasText(" 12345 ") = true
     * </pre>
     */
    public static boolean hasText(String str) {
        int strLen;
        if (str == null || (strLen = str.length()) == 0) {
            return false;
        }
        for (int i = 0; i < strLen; i++) {
            if (!Character.isWhitespace(str.charAt(i))) {
                return true;
            }
        }
        return false;
    }

    /**
     * 判断字符串是否为空(包含null与"","    ")
     *
     * @param str
     * @return
     */
    public static boolean isEmptyIgnoreBlank(String str){
        if(str == null || "".equals(str) || "".equals(str.trim())){
            return true;
        }
        return false;
    }

    /**
     * 把对象转换为long
     * @param obj
     * @return
     */
    public static long objectToLong(Object obj){
        return Long.valueOf(obj.toString());
    }

    /**
     * 把String转换为Integer
     * @param obj
     * @return
     */
    public static Integer StringToInt(String obj){
        return Integer.valueOf(obj.toString());
    }

    /**
     * 把字符串转换为long
     * @param str
     * @return
     */
    public static long stringToLong(String str){
        return Long.valueOf(str);
    }
}
